#include "avz.h"

using namespace AvZ;

AvZ::PaoOperator feng_pao;
AvZ::PaoOperator ping_di_pao;

void Script()
{
    SetZombies({ZOMBIE,
        POLE_VAULTING_ZOMBIE,
        FOOTBALL_ZOMBIE,
        ZOMBONI,
        JACK_IN_THE_BOX_ZOMBIE,
        POGO_ZOMBIE,
        BUNGEE_ZOMBIE,
        LADDER_ZOMBIE,
        CATAPULT_ZOMBIE,
        GARGANTUAR,
        GIGA_GARGANTUAR});

    SelectCards({
        ICE_SHROOM,
        M_ICE_SHROOM,
        DOOM_SHROOM,
        CHERRY_BOMB,
        JALAPENO,
        SQUASH,
        FLOWER_POT,
    });

    SetTime(-599, 1);
    feng_pao.resetPaoList({
        {2, 1},
        {3, 1},
        {4, 1},
    });

    ping_di_pao.resetPaoList({
        {2, 6},
        {3, 6},
        {4, 6},
    });

    for (auto wave : {1, 6, 15}) {
        // PP 601
        SetTime(359 - 387, wave);
        feng_pao.roofPao(2, 9);
        ping_di_pao.roofPao(4, 9);
    }

    for (auto wave : {2, 7, 11, 16}) {
        // IB-PP 1727
        SetTime(1 - 100, wave);
        if (wave == 2) {
            Card(FLOWER_POT, 1, 1);
        }
        Card(ICE_SHROOM, 1, 1);
        SetTime(307 - 387);
        if (wave == 2 or wave == 11) {
            feng_pao.roofPao(3, 9);
        } else {
            ping_di_pao.roofPao(3, 9);
        }
        SetTime(1527 - 387);
        feng_pao.roofPao(2, 8.4);
        ping_di_pao.roofPao(4, 8.4);
        SetTime(1728 - 100 - 319);
        Card(M_ICE_SHROOM, 1, 1);
    }

    for (auto wave : {3, 8, 12, 17}) {
        // I'B-PP 1727
        SetTime(307 - 387, wave);
        if (wave == 8 or wave == 17) {
            feng_pao.roofPao(3, 9);
        } else {
            ping_di_pao.roofPao(3, 9);
        }
        SetTime(1527 - 387);
        feng_pao.roofPao(2, 8.4);
        ping_di_pao.roofPao(4, 8.4);
    }

    for (auto wave : {4, 13, 18}) {
        // PA 601
        SetTime(151, wave);
        Card(FLOWER_POT, 4, 9);
        SetTime(283 - 100, wave);
        Card(CHERRY_BOMB, 4, 9);
        SetTime(284);
        Shovel(4, 9);
        SetTime(359 - 387);
        if (wave == 4 or wave == 13) {
            feng_pao.roofPao(2, 9);
        } else {
            ping_di_pao.roofPao(2, 9);
        }
    }

    for (auto wave : {10}) {
        // PP 601+A'
        SetTime(359 - 387, wave);
        feng_pao.roofPao(2, 9);
        ping_di_pao.roofPao(4, 9);
        SetTime(301);
        Card(JALAPENO, 1, 1);
    }

    for (auto wave : {5, 14}) {
        // N 601
        SetTime(301, wave);
        if (wave == 5) {
            Card({{FLOWER_POT, 2, 9}, {DOOM_SHROOM, 2, 9}});
        } else {
            Card({{FLOWER_POT, 3, 9}, {DOOM_SHROOM, 3, 9}});
        }
    }

    for (auto wave : {8}) {
        SetTime(1235, wave);
        Card(FLOWER_POT, 5, 1);
    }

    for (auto wave : {9}) {
        SetTime(359 - 100, wave);
        Card({{FLOWER_POT, 3, 9}, {CHERRY_BOMB, 3, 9}});
        SetTime(360);
        Shovel(3, 9);
        SetTime(359 - 387);
        ping_di_pao.roofPao(2, 9);
        SetTime(282 + 751 - 488);
        Card(JALAPENO, 5, 1);
        SetTime(282 + 751 + 101);
        Shovel(5, 1);
        SetTime(601 + 601 + 359 - 387);
        feng_pao.roofPao(2, 8.5);
        ping_di_pao.roofPao(4, 8.5);
        SetTime(601 + 601 + 601 + 359);
        feng_pao.roofPao(3, 8.5);
        SetTime(601 + 601 + 601 + 1527 - 387);
        feng_pao.roofPao(1, 7);
        ping_di_pao.roofPao(5, 7);

        KeyConnect('Q', [=]() {
            Card({{FLOWER_POT, 4, 8}, {SQUASH, 4, 8}});
        });
    }

    for (auto wave : {19}) {
        SetTime(301, wave);
        Card({{FLOWER_POT, 2, 9}, {DOOM_SHROOM, 2, 9}});
        SetTime(601 + 359 - 387);
        feng_pao.roofPao(2, 9);
        ping_di_pao.roofPao(4, 9);
        SetTime(601 + 601 + 1 - 100);
        Card(ICE_SHROOM, 1, 1);
        SetTime(601 + 601 + 307 - 387);
        feng_pao.roofPao(3, 9);
        SetTime(601 + 601 + 1527 - 387);
        feng_pao.roofPao(2, 8);
        ping_di_pao.roofPao(4, 8);
    }

    for (auto wave : {20}) {
        SetTime(1054 - 387, wave);
        feng_pao.roofPao(2, 8.6625);
        ping_di_pao.roofPao(4, 8.6625);
        SetTime(1 - 100 - 319);
        Card(M_ICE_SHROOM, 1, 1);
        SetTime(2);
        Shovel(1, 1);
        SetTime(1527 - 387);
        feng_pao.roofPao(2, 8.6625);
        ping_di_pao.roofPao(4, 8.6625);
        feng_pao.roofPao(3, 8.66258);
        ping_di_pao.roofPao(3, 8.6625);
    }
}